diff --git a/django/db/models/query.py b/django/db/models/query.py
index 7956b1695e..036e58c029 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -986,9 +986,20 @@ class QuerySet:
         # Clone the query to inherit the select list and everything
         clone = self._chain()
         # Clear limits and ordering so they can be reapplied
-        clone.query.clear_ordering(True)
+        clone.query.clear_ordering(force_empty=True)
         clone.query.clear_limits()
-        clone.query.combined_queries = (self.query,) + tuple(qs.query for qs in other_qs)
+
+        # Check if 'exists' is being called and modify the query accordingly
+        if getattr(self, '_optimize_exists', False):
+            clone.query.add_annotation(Value(1), alias='__exists_select', is_summary=True)
+            clone.query.set_limits(high=1)
+            clone.query.combined_queries = tuple(
+                qs.query.chain(clone=True).set_limits(high=1).clear_select_clause().add_annotation(Value(1), alias='__exists_select', is_summary=True)
+                for qs in other_qs
+            )
+        else:
+            clone.query.combined_queries = (self.query,) + tuple(qs.query for qs in other_qs)
+
         clone.query.combinator = combinator
         clone.query.combinator_all = all
         return clone
@@ -1002,7 +1013,10 @@ class QuerySet:
             if len(qs) == 1:
                 return qs[0]
             return qs[0]._combinator_query('union', *qs[1:], all=all)
-        return self._combinator_query('union', *other_qs, all=all)
+        # Set the _optimize_exists flag to optimize the exists() call.
+        clone = self._combinator_query('union', *other_qs, all=all)
+        clone._optimize_exists = True
+        return clone
 
     def intersection(self, *other_qs):
         # If any query is an EmptyQuerySet, return it.
@@ -1436,8 +1450,7 @@ class RawQuerySet:
         """Resolve the init field names and value positions."""
         converter = connections[self.db].introspection.identifier_converter
         model_init_fields = [f for f in self.model._meta.fields if converter(f.column) in self.columns]
-        annotation_fields = [(column, pos) for pos, column in enumerate(self.columns)
-                             if column not in self.model_fields]
+        annotation_fields = [(column, pos) for pos, column in enumerate(self.columns) if column not in self.model_fields]
         model_init_order = [self.columns.index(converter(f.column)) for f in model_init_fields]
         model_init_names = [f.attname for f in model_init_fields]
         return model_init_names, model_init_order, annotation_fields
